Fix warnings about pessimizing return moves for C++11 and higher Summary: Throughout the libc++ headers, there are a few instances where _VSTD::move() is used to return a local variable. Howard commented in r189039 that these were there "for non-obvious reasons such as to help things limp along in C++03 language mode". However, when compiling these headers with warnings on, and in C++11 or higher mode (like we do in FreeBSD), they cause the following complaints about pessimizing moves: In file included from tests.cpp:26: In file included from tests.hpp:29: /usr/include/c++/v1/map:1368:12: error: moving a local object in a return statement prevents copy elision [-Werror,-Wpessimizing-move] return _VSTD::move(__h); // explicitly moved for C++03 ^ /usr/include/c++/v1/__config:368:15: note: expanded from macro '_VSTD' #define _VSTD std::_LIBCPP_NAMESPACE ^ Attempt to fix this by adding a _LIBCPP_EXPLICIT_MOVE() macro to __config, which gets defined to _VSTD::move for pre-C++11, and to nothing for C++11 and later. I am not completely satisfied with the macro name (I also considered _LIBCPP_COMPAT_MOVE and some other variants), so suggestions are welcome. :) Reviewers: mclow.lists, howard.hinnant, EricWF Subscribers: arthur.j.odwyer, cfe-commits Differential Revision: http://reviews.llvm.org/D11394 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@245421 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/__config b/include/__config index 600f0fb..5c15156 100644 --- a/include/__config +++ b/include/__config 
@@ -716,6 +716,12 @@  #define _LIBCPP_CONSTEXPR_AFTER_CXX11  #endif   +#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES +# define _LIBCPP_EXPLICIT_MOVE(x) _VSTD::move(x) +#else +# define _LIBCPP_EXPLICIT_MOVE(x) (x) +#endif +  #ifndef _LIBCPP_HAS_NO_ASAN  extern "C" void __sanitizer_annotate_contiguous_container(  const void *, const void *, const void *, const void *); 
diff --git a/include/__hash_table b/include/__hash_table index ec20e10..5cfff5a 100644 --- a/include/__hash_table +++ b/include/__hash_table 
@@ -2108,7 +2108,7 @@  __h.get_deleter().__value_constructed = true;  __h->__hash_ = hash_function()(__h->__value_);  __h->__next_ = nullptr; - return _VSTD::move(__h); // explicitly moved for C++03 + return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03  }    #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -2124,7 +2124,7 @@  __h.get_deleter().__value_constructed = true;  __h->__hash_ = __hash;  __h->__next_ = nullptr; - return _VSTD::move(__h); // explicitly moved for C++03 + return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03  }    template <class _Tp, class _Hash, class _Equal, class _Alloc> 
diff --git a/include/__tree b/include/__tree index 3ad5794..6391609 100644 --- a/include/__tree +++ b/include/__tree 
@@ -1843,7 +1843,7 @@  __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));  __node_traits::construct(__na, _VSTD::addressof(__h->__value_), __v);  __h.get_deleter().__value_constructed = true; - return _VSTD::move(__h); // explicitly moved for C++03 + return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03  }    #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 
diff --git a/include/algorithm b/include/algorithm index c1635fc..9088829 100644 --- a/include/algorithm +++ b/include/algorithm 
@@ -851,7 +851,7 @@  {  for (; __first != __last; ++__first)  __f(*__first); - return _VSTD::move(__f); // explicitly moved for (emulated) C++03 + return _LIBCPP_EXPLICIT_MOVE(__f); // explicitly moved for (emulated) C++03  }    // find 
diff --git a/include/ext/hash_map b/include/ext/hash_map index 31fcedf..0e4ab69 100644 --- a/include/ext/hash_map +++ b/include/ext/hash_map 
@@ -681,7 +681,7 @@  __h.get_deleter().__first_constructed = true;  __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));  __h.get_deleter().__second_constructed = true; - return _VSTD::move(__h); // explicitly moved for C++03 + return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03  }    template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 
diff --git a/include/map b/include/map index eb6b8ed..561c3dd 100644 --- a/include/map +++ b/include/map 
@@ -1523,7 +1523,7 @@  __h.get_deleter().__first_constructed = true;  __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));  __h.get_deleter().__second_constructed = true; - return _VSTD::move(__h); // explicitly moved for C++03 + return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03  }    template <class _Key, class _Tp, class _Compare, class _Allocator> 
diff --git a/include/unordered_map b/include/unordered_map index cf70ab6..3c774d4 100644 --- a/include/unordered_map +++ b/include/unordered_map 
@@ -1511,7 +1511,7 @@  __h.get_deleter().__first_constructed = true;  __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));  __h.get_deleter().__second_constructed = true; - return _VSTD::move(__h); // explicitly moved for C++03 + return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03  }    template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>